﻿using System;
using System.Text;
using System.Collections;
using System.Drawing.Design;
using System.Windows.Forms.Design;
using System.ComponentModel;

namespace MyFastDataSourceBind
{
    /// <summary>
    /// 系统字典类型
    /// </summary>
    /// <remarks>编制 袁永福</remarks>
    [Serializable()]
    public class XSystemDictionary : System.Collections.CollectionBase
    {
        /// <summary>
        /// 初始化对象
        /// </summary>
        public XSystemDictionary() { }

/// <summary>
/// 查询数据库并填充列表
/// </summary>
/// <param name="strSQL">查询数据库使用的SQL语句</param>
public XSystemDictionary(string strSQL)
{
    // 查询数据库获得数据表
    System.Data.DataTable table = ConnectionHelper.ReadDataTable(strSQL);
    if (table != null)
    {
        if (table.Columns.Count >= 1)
        {
            // 若数据表有内容则构造初始化字典对象
            foreach (System.Data.DataRow row in table.Rows)
            {
                // 遍历所有的数据行，并认为第一列为字典项目数值
                // 若存在第二列则认为第二列为字典项目文本，若只有一列
                // 则字典项目文本和数值是相同的。
                string Value = TrimString(row[0]);
                string Name = null;
                if (table.Columns.Count > 1)
                    Name = TrimString(row[1]);
                else
                    Name = Value;
                if (Value != null)
                {
                    // 将字典项目添加到字典项目列表中
                    XSystemDictionaryItem item = this.GetItemByValue(Value);
                    if (item != null)
                    {
                        item.Name = Name;
                    }
                    else
                    {
                        this.List.Add(new XSystemDictionaryItem(null, Name, Value));
                    }
                }
            }//foreach
        }
        table.Dispose();
    }
}

private string strCategory = null;
/// <summary>
/// 系统字典类别
/// </summary>
public string Category
{
    get { return strCategory; }
    set { strCategory = value; }
}

/// <summary>
/// 获得指定序号处的系统字典项目
/// </summary>
/// <param name="index">序号</param>
/// <returns>系统字典项目</returns>
public XSystemDictionaryItem this[int index]
{
    get
    {
        return (XSystemDictionaryItem)this.List[index];
    }
}
/// <summary>
/// 根据字典项目值获得字典项目
/// </summary>
/// <param name="Value">指定的字典项目值</param>
/// <returns>获得的字典项目</returns>
public XSystemDictionaryItem GetItemByValue(string Value)
{
    foreach (XSystemDictionaryItem item in this)
    {
        if (item.Value == Value)
            return item;
    }
    return null;
}
/// <summary>
/// 添加字典项目
/// </summary>
/// <param name="item">新增的字典项目</param>
/// <returns>新项目在列表中的序号</returns>
public int Add(XSystemDictionaryItem item)
{
    return this.List.Add(item);
}

/// <summary>
/// 获得字典项目数组
/// </summary>
/// <returns>项目数组</returns>
public XSystemDictionaryItem[] ToArray()
{
    return (XSystemDictionaryItem[])this.InnerList.ToArray(typeof(XSystemDictionaryItem));
}

        // 以下是对象的静态成员 ***********************************************

/// <summary>
/// 所有缓存的系统字典对象
/// </summary>
private static ArrayList myInstances = null;
/// <summary>
/// 获得指定类型的系统字典
/// </summary>
/// <param name="Category">系统字典类别名称</param>
/// <returns>系统字典数值</returns>
public static XSystemDictionary GetInstance(string Category)
{
    // 检查参数
    if (Category == null || Category.Trim().Length == 0)
        return null;
    if (myInstances == null)
    {
        Reset();
    }
    foreach (XSystemDictionary item in myInstances)
    {
        // 遍历所有缓存的字典对象，查找指定类别的字典对象，
        // 这里的类别不区分大小写。
        if (string.Compare(item.Category, Category, true) == 0)
            return item;
    }
    return null;
}

/// <summary>
/// 获得所有的系统字典类别名称
/// </summary>
/// <returns>类别名称组成的数组</returns>
public static string[] GetCategoryNames()
{
    if (myInstances == null)
    {
        Reset();
    }
    string[] names = new string[myInstances.Count];
    for (int iCount = 0; iCount < myInstances.Count; iCount++)
    {
        names[iCount] = ((XSystemDictionary)myInstances[iCount]).Category;
    }
    return names;
}

/// <summary>
/// 查询数据使用的SQL语句
/// </summary>
public static string QueryCommandText = "Select class , code , name From CodeTable Order by class , name";

/// <summary>
/// 重新加载数据
/// </summary>
public static void Reset()
{
    myInstances = new ArrayList();
    // 调用数据库操作层来查询数据，返回一个DataTable
    System.Data.DataTable table = ConnectionHelper.ReadDataTable(QueryCommandText);
    // 检查DataTable
    if (table != null && table.Columns.Count >= 3)
    {
        foreach (System.Data.DataRow row in table.Rows)
        {
            // 遍历DataTable中的所有的数据行，并认为第一列为字典类别，
            // 第二列为字典项目数值，第三列为字典项目文本。
            string Category = TrimString(row[0]);
            string Value = TrimString(row[1]);
            string Name = TrimString(row[2]);
            if (Category == null || Name == null || Value == null)
                continue;
            // 获得指定类别的字典对象
            XSystemDictionary myCurrent = null;
            foreach (XSystemDictionary item in myInstances)
            {
                if (string.Compare(item.Category, Category, true) == 0)
                {
                    myCurrent = item;
                    break;
                }
            }
            if (myCurrent == null)
            {
                // 若没找到指定类别的字典对象则创建并保存到全局列表中
                myCurrent = new XSystemDictionary();
                myCurrent.Category = Category;
                myInstances.Add(myCurrent);
            }
            // 在当前字典中查找是否已经存在指定数值的字典项目
            bool find = false;
            foreach (XSystemDictionaryItem item in myCurrent)
            {
                if (item.Value == Value)
                {
                    find = true;
                    break;
                }
            }//foreach
            if (find == false)
            {
                // 若没找到相同数值的字典项目则向字典中添加新的字典项目
                myCurrent.Add(new XSystemDictionaryItem(Category, Name, Value));
            }
        }//foreach
    }//if
    if (table != null)
        table.Dispose();
}
/// <summary>
/// 将数值转换为去掉两边空格的字符串
/// </summary>
/// <param name="v">数值</param>
/// <returns>字符串</returns>
private static string TrimString(object v)
{
    if (v == null || DBNull.Value.Equals(v))
        return null;
    string str = Convert.ToString(v);
    if (str != null)
    {
        str = str.Trim();
    }
    return str;
}
    }//public class XSystemCode
}